@@ -1,7 +1,7 @@ |
||
| 1 | 1 |
class Service < ActiveRecord::Base |
| 2 | 2 |
PROVIDER_TO_ENV_MAP = {'37signals' => 'THIRTY_SEVEN_SIGNALS'}
|
| 3 | 3 |
|
| 4 |
- attr_accessible :provider, :name, :token, :secret, :refresh_token, :expires_at, :global, :options |
|
| 4 |
+ attr_accessible :provider, :name, :token, :secret, :refresh_token, :expires_at, :global, :options, :uid |
|
| 5 | 5 |
|
| 6 | 6 |
serialize :options, Hash |
| 7 | 7 |
|
@@ -15,8 +15,8 @@ class Service < ActiveRecord::Base |
||
| 15 | 15 |
scope :available_to_user, lambda { |user| where("services.user_id = ? or services.global = true", user.id) }
|
| 16 | 16 |
scope :by_name, lambda { |dir = 'desc'| order("services.name #{dir}") }
|
| 17 | 17 |
|
| 18 |
- def disable_agents |
|
| 19 |
- agents.each do |agent| |
|
| 18 |
+ def disable_agents(conditions = {})
|
|
| 19 |
+ agents.where.not(conditions).each do |agent| |
|
| 20 | 20 |
agent.service_id = nil |
| 21 | 21 |
agent.disabled = true |
| 22 | 22 |
agent.save!(validate: false) |
@@ -24,6 +24,7 @@ class Service < ActiveRecord::Base |
||
| 24 | 24 |
end |
| 25 | 25 |
|
| 26 | 26 |
def toggle_availability! |
| 27 |
+ disable_agents(user_id: self.user_id) if global |
|
| 27 | 28 |
self.global = !self.global |
| 28 | 29 |
self.save! |
| 29 | 30 |
end |
@@ -76,9 +77,10 @@ class Service < ActiveRecord::Base |
||
| 76 | 77 |
def self.initialize_or_update_via_omniauth(omniauth) |
| 77 | 78 |
options = provider_specific_options(omniauth) |
| 78 | 79 |
|
| 79 |
- find_or_initialize_by(provider: omniauth['provider'], name: options[:name]).tap do |service| |
|
| 80 |
+ find_or_initialize_by(provider: omniauth['provider'], uid: omniauth['uid'].to_s).tap do |service| |
|
| 80 | 81 |
service.assign_attributes token: omniauth['credentials']['token'], |
| 81 | 82 |
secret: omniauth['credentials']['secret'], |
| 83 |
+ name: options[:name], |
|
| 82 | 84 |
refresh_token: omniauth['credentials']['refresh_token'], |
| 83 | 85 |
expires_at: omniauth['credentials']['expires_at'] && Time.at(omniauth['credentials']['expires_at']), |
| 84 | 86 |
options: options |
@@ -0,0 +1,7 @@ |
||
| 1 |
+class AddUidColumnToServices < ActiveRecord::Migration |
|
| 2 |
+ def change |
|
| 3 |
+ add_column :services, :uid, :string |
|
| 4 |
+ add_index :services, :uid |
|
| 5 |
+ add_index :services, :provider |
|
| 6 |
+ end |
|
| 7 |
+end |
@@ -11,7 +11,10 @@ |
||
| 11 | 11 |
# |
| 12 | 12 |
# It's strongly recommended that you check this file into your version control system. |
| 13 | 13 |
|
| 14 |
-ActiveRecord::Schema.define(version: 20140809211540) do |
|
| 14 |
+ActiveRecord::Schema.define(version: 20140811200922) do |
|
| 15 |
+ |
|
| 16 |
+ # These are extensions that must be enabled in order to support this database |
|
| 17 |
+ enable_extension "plpgsql" |
|
| 15 | 18 |
|
| 16 | 19 |
create_table "agent_logs", force: true do |t| |
| 17 | 20 |
t.integer "agent_id", null: false |
@@ -128,8 +131,11 @@ ActiveRecord::Schema.define(version: 20140809211540) do |
||
| 128 | 131 |
t.text "options" |
| 129 | 132 |
t.datetime "created_at" |
| 130 | 133 |
t.datetime "updated_at" |
| 134 |
+ t.string "uid" |
|
| 131 | 135 |
end |
| 132 | 136 |
|
| 137 |
+ add_index "services", ["provider"], name: "index_services_on_provider", using: :btree |
|
| 138 |
+ add_index "services", ["uid"], name: "index_services_on_uid", using: :btree |
|
| 133 | 139 |
add_index "services", ["user_id", "global"], name: "index_accounts_on_user_id_and_global", using: :btree |
| 134 | 140 |
|
| 135 | 141 |
create_table "user_credentials", force: true do |t| |
@@ -115,3 +115,9 @@ bob_basecamp_agent: |
||
| 115 | 115 |
user: bob |
| 116 | 116 |
service: generic |
| 117 | 117 |
guid: <%= SecureRandom.hex %> |
| 118 |
+ |
|
| 119 |
+jane_basecamp_agent: |
|
| 120 |
+ type: Agents::BasecampAgent |
|
| 121 |
+ user: jane |
|
| 122 |
+ service: generic |
|
| 123 |
+ guid: <%= SecureRandom.hex %> |
@@ -5,13 +5,32 @@ describe Service do |
||
| 5 | 5 |
@user = users(:bob) |
| 6 | 6 |
end |
| 7 | 7 |
|
| 8 |
- it "should toggle the global flag" do |
|
| 9 |
- @service = services(:generic) |
|
| 10 |
- @service.global.should == false |
|
| 11 |
- @service.toggle_availability! |
|
| 12 |
- @service.global.should == true |
|
| 13 |
- @service.toggle_availability! |
|
| 14 |
- @service.global.should == false |
|
| 8 |
+ describe "#toggle_availability!" do |
|
| 9 |
+ it "should toggle the global flag" do |
|
| 10 |
+ @service = services(:generic) |
|
| 11 |
+ @service.global.should == false |
|
| 12 |
+ @service.toggle_availability! |
|
| 13 |
+ @service.global.should == true |
|
| 14 |
+ @service.toggle_availability! |
|
| 15 |
+ @service.global.should == false |
|
| 16 |
+ end |
|
| 17 |
+ |
|
| 18 |
+ it "disconnects agents and disables them if the previously global service is made private again", focus: true do |
|
| 19 |
+ agent = agents(:bob_basecamp_agent) |
|
| 20 |
+ jane_agent = agents(:jane_basecamp_agent) |
|
| 21 |
+ |
|
| 22 |
+ service = agent.service |
|
| 23 |
+ service.toggle_availability! |
|
| 24 |
+ service.agents.length.should == 2 |
|
| 25 |
+ |
|
| 26 |
+ service.toggle_availability! |
|
| 27 |
+ jane_agent.reload |
|
| 28 |
+ jane_agent.service_id.should be_nil |
|
| 29 |
+ jane_agent.disabled.should be true |
|
| 30 |
+ |
|
| 31 |
+ service.reload |
|
| 32 |
+ service.agents.length.should == 1 |
|
| 33 |
+ end |
|
| 15 | 34 |
end |
| 16 | 35 |
|
| 17 | 36 |
it "disables all agents before beeing destroyed" do |
@@ -74,6 +93,7 @@ describe Service do |
||
| 74 | 93 |
}.to change { @user.services.count }.by(1)
|
| 75 | 94 |
service = @user.services.first |
| 76 | 95 |
service.name.should == 'johnqpublic' |
| 96 |
+ service.uid.should == '123456' |
|
| 77 | 97 |
service.provider.should == 'twitter' |
| 78 | 98 |
service.token.should == 'a1b2c3d4...' |
| 79 | 99 |
service.secret.should == 'abcdef1234' |
@@ -88,6 +108,7 @@ describe Service do |
||
| 88 | 108 |
service.provider.should == '37signals' |
| 89 | 109 |
service.name.should == 'Dominik Sander' |
| 90 | 110 |
service.token.should == 'abcde' |
| 111 |
+ service.uid.should == '12345' |
|
| 91 | 112 |
service.refresh_token.should == 'fghrefresh' |
| 92 | 113 |
service.options[:user_id].should == 12345 |
| 93 | 114 |
service.expires_at = Time.at(1401554352) |
@@ -101,6 +122,7 @@ describe Service do |
||
| 101 | 122 |
service = @user.services.first |
| 102 | 123 |
service.provider.should == 'github' |
| 103 | 124 |
service.name.should == 'dsander' |
| 125 |
+ service.uid.should == '12345' |
|
| 104 | 126 |
service.token.should == 'agithubtoken' |
| 105 | 127 |
end |
| 106 | 128 |
end |